#include "DemanderNbr.h"

#include <QtGui/QLabel>
#include <QtGui/QSpinBox>
#include <QtGui/QGroupBox>
#include <QtGui/QPushButton>
#include <QtGui/QHBoxLayout>

using namespace std;

/**
 * Constructeur par défaut. Détermine la question et le message
 * d'aide, les bornes et l'éventuel parent. Initialise également tous
 * les autres champs.
 *
 * @param question question posée à l'utilisateur, par exemple "Entrer
 * le nombre de PVs gagnés", ...
 * @param aide texte qui est affiché pour l'aide sur le spinbox.
 * @param min borne inférieure du spinbox.
 * @param max borne supérieure du spinbox.
 * @param parent pointeur sur le parent (orphelin par défaut).
 */
DemanderNbr::DemanderNbr(const string& question, const string& aide,
			 const unsigned int& min, const unsigned int& max,
			 QWidget *parent)
  : BaseDialog( QString("DemanderNbr"), parent )
{
  texte = new QLabel( trUtf8( question.c_str() ), this );

  nbr = new QSpinBox( this );
  nbr -> setMinimum( min );
  nbr -> setMaximum( max );
  nbr -> setToolTip( trUtf8( aide.c_str() ) );

  groupe = new QGroupBox( trUtf8(""), this );

  prepareBoutons();

  QHBoxLayout *groupeLayout = new QHBoxLayout( groupe );

  groupeLayout -> addWidget( texte );
  groupeLayout -> addWidget( nbr );

  fenetreLayout -> addWidget( groupe );

  setFenetreLayout();
}

/**
 * Constructeur de copie. Il faut initialiser correctement le spinbox
 * et créer les boutons.
 */
DemanderNbr::DemanderNbr(const DemanderNbr& demNbr)
  : BaseDialog( demNbr )
{
  texte = new QLabel( demNbr.texte -> text(), this );

  nbr = new QSpinBox( this );
  nbr -> setMinimum( demNbr.nbr -> minimum() );
  nbr -> setMaximum( demNbr.nbr -> maximum() );
  nbr -> setToolTip( demNbr.nbr -> toolTip() );

  groupe = new QGroupBox( trUtf8(""), this );

  prepareBoutons();

  QHBoxLayout *groupeLayout = new QHBoxLayout( groupe );

  groupeLayout -> addWidget( texte );
  groupeLayout -> addWidget( nbr );

  fenetreLayout -> addWidget( groupe );

  setFenetreLayout();
}

/**
 * Destructeur, qui laisse au mécanisme natif de Qt le soin de libérer
 * la mémoire allouée.
 */
DemanderNbr::~DemanderNbr()
{}

/**
 * Méthode permettant de récupérer le nombre désiré.
 *
 * @return StatusCode, dont l'etat peut être \e false si le choix est
 * annulé, ou \e true si validé. Dans ce dernier cas, valeur() donne
 * un accès au nombre sélectionné.
 */
StatusCode DemanderNbr::Nbr()
{
  this -> exec();

  if ( !OK )
    return StatusCode( OK, -1, 0);

  return StatusCode( OK, nbr -> value() );
}

/**
 * Méthode créant les boutons et réalisant la connection avec les
 * slots de BaseDialog.
 *
 * Evite de dupliquer le code entre le constructeur et le constructeur
 * de copie.
 *
 * Le niveau de sortie est paramétré par BaseDialog::interne :\n
 * - \e FUNC  affiche les messages de début et de fin de méthode.\n
 */
void DemanderNbr::prepareBoutons()
{
  boutons.push_back( new QPushButton( trUtf8("&Quitter"), this ) );
  boutons.back() -> setToolTip( trUtf8("Quitter le programme") );
  connect( boutons.back(), SIGNAL( clicked() ), this, SLOT( annuler() ) );
  boutons.push_back( new QPushButton( trUtf8("&OK"), this ) );
  boutons.back() -> setToolTip( trUtf8("Accepter et continuer") );
  connect( boutons.back() , SIGNAL( clicked() ), this, SLOT( fermer() ) );  
}
